import axios, { Method } from "axios";
import store from "@/store";
import {ElMessage} from 'element-plus'
import router from "@/router";
//导出基准地址，其他地方不是通过axios发请求的地方也会用到
// export const baseURL = "http://pcapi-xiaotuxian-front-devtest.itheima.net/";
const instance = axios.create({
  //axios 配置 ： baseURL timeout
  // baseURL,
  timeout: 50000, //50S超时
});
//请求拦截
instance.interceptors.request.use(
  (config) => {
    // 拦截的业务逻辑
    //获取本地 token
    const profile = localStorage.getItem('token');
    //判断是否有 token
    if (profile) {
      //设置 token
      config.headers.Authorization = profile;
    }
    return config;
  },
  (err) => {
    //拦截失败
    return Promise.reject(err);
  }
);
//响应拦截
instance.interceptors.response.use(
  (res) => {
    return Promise.resolve(res.data);
  },
  (err) => {
    // 如果 401 状态码
    if (err.response) {
      ElMessage.closeAll()
      switch(err.response.status){
        case 401:
          //1. 清空本地无效信息
          // 2.跳转到登录页面，并且需携带当前路由地址给登录页，以便登录成功后返回原页面
          store.commit("user/CLEAR_USERINFO"); //引入 store 模块
          // 当前路由地址--组件中'user?a=10', $router.path=== /user , $route.fullpath=== /user?a=10
          // js 模块中：router.currentRoute.fullPath 就是当前路由地址，vue3 中 router.currentRoute 是 ref 响应式数据，需加 .value
          // encodeURIComponent() js 原生转码 防止解析地址出问题，有可能会有特殊字符
          // const fullPath = encodeURIComponent(router.currentRoute.value.fullPath);
          ElMessage.error('身份认证过期，请重新登录！')
          router.push("/login?redirectUrl=" + ""); //引入 router 模块
          break;
        default:
          // 403 权限不足，407 角色权限不足
          ElMessage.error(err.response.data && err.response.data.msg ? err.response.data.msg : '数据获取失败！')
          break;
      }
    }
    return Promise.reject(err);
  }
);
// 请求工具函数,负责发请求，url,method,submitData
export default (url:string, method:Method, submitData?:any,contentType?:string) => {
  return instance({
    url,
    method,
    // 1.如果是 get 请求，需要使用 params 传参
    // 2.如果是 post 请求，需要用 deta 传参
    // [] 可以设置动态变量，写 JS 表达式
    // 有可能用户传的是大写的 GET，POST，通过 toLowerCase() 全部转换为小写 toUpperCase() 全部转换为大写
    [method.toLowerCase() === "get" || method.toLowerCase() === 'delete' ? "params" : "data"]: submitData,
    headers:{
      'Content-Type':contentType ? contentType : 'application/json'
    }
  })
};
